#ifndef SERVER_H_
#define SERVER_H_

#include "../utils/Log.h"
#include "../utils/FuncionesComunes.h"
#include "../process/Semaforo.h"
#include "../process/ServerSocket.h"
#include "../process/SIGINT_Handler.h"
#include "../process/SignalHandler.h"
#include "Fifo.h"
#include "Mensaje.h"
#include "Conversacion.h"
#include <string>
#include <vector>
#include <map>
#include <list>

#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>

#define ARCHIVO_SEMAFORO "../process/Semaforo.cpp"
#define BUFFSIZE 100

using namespace std;

class Server {
private:
	map<int,InfoCliente> clientesSinConv;
	vector<Conversacion> conversaciones;
	SIGINT_Handler sigint_handler;
	Fifo *canalServidor;
	ServerSocket socket;
	Log log;

	static const int CLI_INEX = -1;

	void escribirLog(string mensaje);
	bool hayClientes();

	//Fifo
	void cerrarConexion();
	Mensaje recibirPedido();
	void enviarRespuesta(Mensaje m);
	Mensaje procesarPedido(Mensaje m);

	//Tratamiento mensajes
	bool verificaNombre(int nombre, int i);
	Mensaje conectarCliente(int id, string cliente, string path);
	void desconectarCliente(int id);
	Mensaje iniciarConv(int idCliente);
	void eliminarConv(int id);
	Mensaje abandonarConversacion(int cliente, int idConversacion);
	Mensaje listarConversarciones(int dest);
	Mensaje listarClientes(int pid, int idConversacion);
	Mensaje mensajeError(string dest, string mensaje );
	Mensaje mensajeBienvenida(string dest);
	Mensaje mensajeUnion(string dest);

public:
	Server();
	void activarModoDebug(bool activar);
	void ejecutar();
	virtual ~Server();
};

#endif /* SERVER_H_ */
